# -*- coding:utf-8 -*-
"""
这个程序用作生成一个被调用的库，所有的midinote，节奏控制，效果控制都在这个库中实现
"""
import sys
import time as t
from hashlib import md5
from midiutil.MidiFile import MIDIFile

STARTTIME = 0
REPEAT = 5
# 这个tempo如果由名字决定更好吧？也许
TEMPO = (100, 200, 200, 200, 80)

"""
2011-04-26：这样吧，到5月1日我准备先做到一个 开始节奏缓慢，中间节奏激烈，最后再节奏缓慢的一个demo版试试
            一个Track是一系列键盘/任何MIDI乐器输入的组合，一个MIDI Channel是一个乐器的音色，
            一个Track上可以有多个MIDI Channel
            大致这样分 
            第一阶段能做到以上功能
            第二阶段做到在web应用使用
            第三阶段让音乐变的生动一些的调节
            第四阶段对这个模块进行整理

"""

class MidiProxy:
    def __init__(self, words):
        self.words = words
        self.md5words = md5(words).hexdigest()
        self.create_midifile()
        self.generate_tracks()
        channel = 0
        time = 0
        # 这里的channel还没有做变化，因为现在只用钢琴音
        for t in range(self.midifile.numTracks):
            self.generate_tempo(t)
            for i in range(REPEAT):
                self.generate_notes(t, channel, time)
                time = time + len(self.md5words)

    def create_midifile(self):
        tracks = self.choice_a_track()
        self.midifile = MIDIFile(tracks)

    def get_pitch(self, w):
        pitch_pool = {
            '0': 59, 
            '1': 60, '2': 62, '3': 64, '4': 65, '5': 67, '6': 69, '7': 71, 
            '8': 72, '9': 74, 'a': 76, 'b': 77, 'c': 79, 'd': 81, 'e': 83, 
            'f': 84,
        }
        return pitch_pool[w]

    def generate_notes(self, track, channel, time):
        "生成一堆声音，现在只是顺序的播放所有md5后的顺序，以后希望能对此加以改变，这个放到第三阶段做吧"
        duration = 1
        volume = 100
        for w in self.md5words:
            self.midifile.addNote(track, channel, self.get_pitch(w), time, duration, volume)
            time += 1

    def generate_tempo(self, track):
        "生成一些节奏，根据每一个阶段生成不同的节奏"
        for i in range(REPEAT):
            self.midifile.addTempo(track, i*len(self.md5words), tempo[i])


    def generate_tracks(self):
        "生成音轨"
        for t in range(self.midifile.numTracks):
            self.midifile.addTrackName(t, STARTTIME, 'sample track %s' % t)

    def choice_a_track(self):
        "一般使用一个音轨先，这个音轨到底做什么的我还不是最清楚，所以先返回1吧"
        return 1

    def save_to_file(self, filename):
        traget_file = open(filename, 'wb')
        self.midifile.writeFile(traget_file)
        self.midifile.close()
        traget_file.close()

def main(argv):
    if len(argv) != 2:
        print 'touse: python midiproxy.py yourname'
        sys.exit()
    
    print 'Starting Midi translate from youname'
    m = MidiProxy(argv[1])
    filename = 'good_baby.mid'
    print 'Got it named %s' % filename
    m.save_to_file(filename)


if __name__ == "__main__":
    """
    test this
    """
    main(sys.argv)
